package com.soul.dubbo.api.mongo;

import com.soul.model.mongo.*;
import org.bson.types.ObjectId;

import java.util.List;
import java.util.Map;

/**
 * @author mdoya
 * @version 1.0
 * @description:
 */
public interface SoulApi {
    /**
     *  查询问卷列表
     * @return List<Soul>
     */
    List<Soul> findSoul();

    void addSoul(Soul soul);

    /**
     *  新增问卷
     * @param questions 问卷对象
     * @return 报告id
     */
    String addQuestions(Questions questions);

    /**
     *  新增选项题目
     * @param options
     * @return
     */
    String addOptions(Options options);

    /**
     *  查询灵魂测试结果
     * @param currendUserId 当前用户id
     * @param reportId 报告id
     * @return List<Questions>
     */
    List<Questions> findSoulSubject(Long currendUserId, String reportId);

    /**
     *  查询选项编号 选项题目
     * @param optionIds
     * @return
     */
    Map<String, Options> findOptionIds(List<ObjectId> optionIds);

    /**
     *  查询灵魂测试报告
     * @param reportId 最新报告id
     * @return
     */
    Report findReport(String reportId);

    /**
     *  查询当前用户最新报告
     * @param userId
     * @return
     */
    Report findByUserReport(Long userId);

    /**
     *  查询QuestionCover集合所有封面
     * @return List<QuestionCover>
     */
    List<QuestionCover> findQuestionCover();

    /**
     *  questionLevelList作为条件查询Questions集合所有题目
     * @param questionLevelList 条件查询
     * @return
     */
    List<Questions> findQuestions(List<String> questionLevelList);

    /**
     *  questionsIds作为调条件查询Options集合所有选项题
     * @param questionsIds
     * @return
     */
    List<Options> findOptions(List<String> questionsIds);

    String addQuestionCover(QuestionCover questionCover);

    List<Questions> findQuestionsOne(String level);

    List<Options> findOptionsOne(String questionsId);

    /**
     *  查询Options集合对象
     * @param optionId
     * @return
     */
    Options findQuestionById(String optionId);

    /**
     *  灵魂测试报告
     * @param report
     */
    void addReport(Report report);

    /**
     *  id查询最新报告
     * @param reportId
     * @return
     */
    Report findReportById(String reportId);

    /**
     *  查询最新是否存在
     * @param currendUserId
     * @param level 级别
     * @return
     */
    Report findReportExits(Long currendUserId, String level);

    /**
     *  查询题目级别
     * @param questionId
     * @return
     */
    Questions findQuestionLevel(String questionId);

    /**
     *  查询选项题累加分数
     * @param optionIds
     * @return
     */
    Integer findQuestionByIds(List<ObjectId> optionIds);

    /**
     *  修改最新报告
     * @param report
     */
    void updateReport(Report report);

    /**
     *  查询当前用户等级最新报告
     * @param userId
     * @param level
     * @return
     */
    Report findReportList(Long userId, String level);
}
